﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;

namespace Bibilioteca.DataAccess
{
    public class EjemplaresDao : DaoBase
    {
        public int paramID;
        public string estado;
        public int materialID;
        
        public EjemplaresDao()
        {
            reiniciarParams();
        }

        /*
         * Establece los valores iniciales para los parametros.
         */
        private void reiniciarParams()
        {
            paramID = -1;
            estado = "";
            materialID = -1;
        }

        /*
         * Retorna un DataTable con todos los ejemplars y todos los campos
         * asociados a ellos.
         */
        public DataTable todosLosEjemplares()
        {
            string sql = "SELECT * FROM ejemplares";
            return EjecutarQuery(sql);
        }


        /*
		 * Dado un numero de ejemplar, lo retorna.
		 */
        public DataTable GetEjemplarNumero()
        {
            string sql = "SELECT * FROM ejemplares where ejemplar_id = @numero";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }


        /*
         * Busca los ejemplars segun filtros generados.
         * Modo puede ser modoConsultaOr o modoConsultaAnd.
         * modoUpdate o modoInsert no se usan aca.
         */
        public DataTable GetEjemplarFiltros(int modo)
        {
            string separador = " or "; //Consulta por defecto tipo OR.
            if (modo == 0) separador = " or ";
            else if (modo == 1) separador = " and ";

            string sql = "SELECT * FROM ejemplares where ";

            bool primerParam = true; //Soy el primer parametro? sino me debe anteceder un AND o un OR

            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            if (paramID != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " ejemplar_id = @ejemplar_id ";
                parametrosList.AddLast(new DbParameter("ejemplar_id", SqlDbType.Int, paramID));
            }

            if (estado.Length > 0)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " ejemplar_estado like '%' + @ejemplar_estado ";
                parametrosList.AddLast(new DbParameter("ejemplar_estado", SqlDbType.VarChar, estado));
            }

            if (materialID != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " ejemplar_material_id = @ejemplar_material_id ";
                parametrosList.AddLast(new DbParameter("ejemplar_material_id", SqlDbType.Int, materialID));
            }

            sql += "; ";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            DataTable retorno = new DataTable();

            if (parametrosList.Count > 0)
                retorno = EjecutarQuery(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }


        public void insertarEjemplar(int cantidad)
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            string sql = "INSERT INTO ejemplares ( ";
            string sqlParametros = "";

            if (estado.Length > 0)
            {
                sql += " ejemplar_estado "; sqlParametros += " @ejemplar_estado";
                parametrosList.AddLast(new DbParameter("ejemplar_estado", SqlDbType.VarChar, estado));
            }

            if (materialID != -1)
            {
                sql += ", ejemplar_material_id "; sqlParametros += ", @ejemplar_material_id ";
                parametrosList.AddLast(new DbParameter("ejemplar_material_id", SqlDbType.Int, materialID));
            }

            sql += ") VALUES ( " + sqlParametros + "); ";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            for (int i = 1; i <= cantidad; i++)
                EjecutarUpdate(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void modificarEjemplar()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            bool primerParam = true;

            string sql = "UPDATE ejemplares SET ";
            if (estado.Length > 0)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "ejemplar_estado = @ejemplar_estado";
                parametrosList.AddLast(new DbParameter("ejemplar_estado", SqlDbType.VarChar, estado));
            }

            if (materialID != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += " ejemplar_material_id = @ejemplar_material_id ";
                parametrosList.AddLast(new DbParameter("ejemplar_material_id", SqlDbType.Int, materialID));
            }

            sql += " WHERE ejemplar_id = @ejemplar_id";

            parametrosList.AddLast(new DbParameter("ejemplar_id", SqlDbType.Int, paramID));

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void eliminarEjemplar()
        {
            if (paramID != -1)
            {
                string sql = "DELETE FROM ejemplares where ejemplar_id = @numero";
                EjecutarUpdate(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });

                reiniciarParams();
            }

        }


    }
}